package cn.seaboot.admin.goal;

/**
 * Relational operators 关系运算符
 * <p>
 * 正常的逻辑运算符是6个：小于，小于等于，等于，不等，大于等于，大于。
 *
 * @author Mr.css
 * @version 2022-11-25 20:42
 */
public enum Relational {
    /**
     * 小于
     */
    LT(0),
    /**
     * 小于等于
     */
    LE(1),

    /**
     * 等于
     */
    EQ(2),
    /**
     * 不等于
     */
    UE(3),

    /**
     * 大于等于
     */
    GE(4),
    /**
     * 大于
     */
    GT(5);

    private final int value;

    Relational(int value) {
        this.value = value;
    }

    public int value() {
        return this.value;
    }

    public static Relational valueOf(int value) {
        return Relational.values()[value];
    }

    /**
     * 数据比较规则
     *
     * @param a 数据 a
     * @param b 数据 b
     * @return 对比结果
     */
    public <T> boolean process(Comparable<T> a, T b) {
        switch (this) {
            case LT:
                return a.compareTo(b) < 0;
            case LE:
                return a.compareTo(b) <= 0;
            case EQ:
                return a.equals(b);
            case UE:
                return !a.equals(b);
            case GE:
                return a.compareTo(b) >= 0;
            case GT:
                return a.compareTo(b) > 0;
            default:
                return false;
        }
    }

    /**
     * 数据比较规则
     *
     * @param a 数据 a
     * @param b 数据 b
     * @return 对比结果
     */
    public <T> boolean process(int a, int b) {
        switch (this) {
            case LT:
                return a < b;
            case LE:
                return a <= b;
            case EQ:
                return a == b;
            case UE:
                return a != b;
            case GE:
                return a >= b;
            case GT:
                return a > b;
            default:
                return false;
        }
    }
}
